//////////////////////////////////////////////////////////////////////////
// Constants
//////////////////////////////////////////////////////////////////////////
#define KEYBOARD_CLASS_NAME				L"\\Driver\\kbdclass"
#define MOUSE_CLASS_NAME				L"\\Driver\\mouclass"

#define KEYBOARD_HID_NAME				L"\\Driver\\kbdhid"
#define MOUSE_HID_NAME					L"\\Driver\\mouhid"
#define I8042PRT_NAME					L"\\Driver\\i8042prt"

//////////////////////////////////////////////////////////////////////////
// IO Control Codes
//////////////////////////////////////////////////////////////////////////
#define IOCTL_KEYBOARD					CTL_CODE_AST(0)
#define IOCTL_MOUSE						CTL_CODE_AST(1)

//////////////////////////////////////////////////////////////////////////
// Functions
//////////////////////////////////////////////////////////////////////////
VOID InitializeKeyMouse();
VOID DisposeKeyMouse();
BOOLEAN ProcessIoCtlForKeyMouse(ULONG ioControlCode, PDEVICE_OBJECT deviceObject, PIRP irp, PIO_STACK_LOCATION irpStack);

NTSTATUS LookupServiceCallback();

//////////////////////////////////////////////////////////////////////////
// Callbacks
//////////////////////////////////////////////////////////////////////////
typedef VOID(*KeyboardClassServiceCallback)(IN PDEVICE_OBJECT DeviceObject, IN PKEYBOARD_INPUT_DATA InputDataStart, IN PKEYBOARD_INPUT_DATA InputDataEnd, IN OUT PULONG InputDataConsumed);
typedef VOID(*MouseClassServiceCallback)(IN PDEVICE_OBJECT DeviceObject, IN PMOUSE_INPUT_DATA InputDataStart, IN PMOUSE_INPUT_DATA InputDataEnd, IN OUT PULONG InputDataConsumed);

//////////////////////////////////////////////////////////////////////////
// Data
//////////////////////////////////////////////////////////////////////////
typedef struct _KEYMOUSE_INFO {
	PDEVICE_OBJECT						KeyboardDeviceObject;
	PDEVICE_OBJECT						MouseDeviceObject;
	KeyboardClassServiceCallback		KeyboardCallback;
	MouseClassServiceCallback			MouseCallback;
} KEYMOUSE_INFO, *PKEYMOUSE_INFO;
